選擇Redis快取
-> 建立Redis快取
測試使用C0專案就可以,接著等待一段時間建立完成
需要使用 Microsoft.Extensions.Caching.Redis
NuGet套件
在存取金鑰
複製連接字串,貼在appsettings.json
建立的connectionStrings屬性內
並在Startup.cs添加使用AddDistributedRedisCache讀取Configuration.GetConnectionString取出的連接字串註冊服務
services.AddDistributedRedisCache(option =>
{
option.Configuration = Configuration.GetConnectionString("RedisConnection");
option.InstanceName = "master";
});
做完以上步驟,接著使用Redis功能,以下為舉例
1.藉由簡單GetString、SetString示範總瀏覽數
2.接著進階示範做出:當使用者一分鐘內送出10個請求,警告使用者**"你已經被禁止瀏覽本網頁一分鐘"**
需要使用到Json(反)序列化,將Redis讀取到的字串轉回物件方便使用。
並藉由SetSlidingExpiration
設定生命週期,這邊設為一分鐘壽命,達到使用者一分鐘限制功能。
public class HomeController : Controller
{
private IDistributedCache _cache;
public HomeController(IDistributedCache cache)
{
_cache = cache;
}
public IActionResult Index()
{
//====示範儲存資料,每一次使用者進來網頁點閱數+1====
string clickCount = _cache.GetString("ReqeustCount") ?? "0";
_cache.SetString("ReqeustCount", AddOneClick(clickCount));
ViewData["ReqeustCount"] = clickCount;
//====示範:瀏覽使用者IP瀏覽次數,當使用者短時間瀏覽次數多送出請告,使用JSON(反)序列化集合物件====
var ip = GetClientUserIp(HttpContext);
var userIP = _cache.GetString($"userIP_{ip}") ==null ? new UserIP()
{
IP = ip,ReqeustCount=0
}: Newtonsoft.Json.JsonConvert.DeserializeObject<UserIP>(_cache.GetString($"userIP_{ip}"));
userIP.ReqeustCount = userIP.ReqeustCount + 1;
//如果1分鐘內送出10次請求,列為黑名單
if(userIP.ReqeustCount > 10)
{
return Content("你已經被禁止瀏覽本網頁一分鐘");
}
var options = new DistributedCacheEntryOptions();
options.SetSlidingExpiration(TimeSpan.FromMinutes(1));
_cache.SetString($"userIP_{ip}", Newtonsoft.Json.JsonConvert.SerializeObject(userIP), options);
ViewData["userIP"] = userIP;
return View();
}
private string AddOneClick(string clickCount)
{
clickCount = $"{(int.Parse(clickCount) + 1)}";
return clickCount;
}
private string GetClientUserIp(HttpContext context)
{
var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (string.IsNullOrEmpty(ip))
{
ip = context.Connection.RemoteIpAddress.ToString();
}
return ip;
}
}
正常請求畫面
超過十次請求後畫面